//角色战斗属性相关
package battle_attr

import (
	"fmt"
	"sanguo/node/common/battleAttr"
	cs_message "sanguo/protocol/cs/message"

	"github.com/golang/protobuf/proto"
)

var (
	ErrInvaildAttr = fmt.Errorf("invaild battleAttr")
)

type BattleAttr struct {
	Idx int32
	Val int32
}

type RoleBattleAttr struct {
	battleAttrList []*BattleAttr
}

func (this *RoleBattleAttr) GetBattleAttrList() []*BattleAttr {
	return this.battleAttrList
}

func (this *RoleBattleAttr) GetBattleAttr(idx int32) (int32, error) {
	if idx >= 0 && idx < int32(len(this.battleAttrList)) {
		return this.battleAttrList[idx].Val, nil
	} else {
		return 0, ErrInvaildAttr
	}
}

func (this *RoleBattleAttr) SetBattleAttr(idx int32, val int32) error {
	if idx >= 0 && idx < int32(len(this.battleAttrList)) {
		ele := this.battleAttrList[idx]
		if ele.Val == val {
			return nil
		}
		ele.Val = val
		return nil
	} else {
		return ErrInvaildAttr
	}
}

func (this *RoleBattleAttr) AddBattleAttr(idx int32, val int32) (int32, error) {
	min := battleAttr.BattleAttrInfo[idx].Min
	max := battleAttr.BattleAttrInfo[idx].Max

	if idx >= 0 && idx < int32(len(this.battleAttrList)) {

		ele := this.battleAttrList[idx]

		oldVal := ele.Val
		newVal := ele.Val + val

		if newVal < min {
			newVal = min
		}

		if newVal > max {
			newVal = max
		}
		if oldVal == newVal {
			return newVal, nil
		}

		ele.Val = newVal
		return newVal, nil
	} else {
		return 0, ErrInvaildAttr
	}
}

//打包所有属性
func (this *RoleBattleAttr) PackAllBattleAttr() []*cs_message.BattleAttr {
	ret := []*cs_message.BattleAttr{}
	for _, v := range this.battleAttrList {
		attr := &cs_message.BattleAttr{
			Id:  proto.Int32(v.Idx),
			Val: proto.Int32(v.Val),
		}
		ret = append(ret, attr)
	}
	return ret
}

func (this *RoleBattleAttr) Init(attrs []*BattleAttr) {
	this.battleAttrList = attrs
}
